*--------------------------------------------------------------; * Selects a single-stage cluster sample from a finite ; * population stored in a SAS data set. ; * noprint = presence suppresses printing of sample ; * frame = SAS data set name containing frame ; * cluster = class variable indicating cluster ; * setup = optional data set containing parameters ; * npop = number of clusters in population ; * n = number of clusters in sample ; * sample = optional name of sample data set ; * seed = optional seed for random number generator ; *--------------------------------------------------------------; %macro cl1(noprint,frame=,cluster=,setup=,npop=,n=,sample=,seed=); %if %length(&sample) = 0 %then %let sample = %str(sample); %if %length(&frame) = 0 %then %let frame = %str(frame); %if %length(&npop) = 0 %then %let npop = %str(npop); %if %length(&cluster) = 0 %then %let cluster =cluster; %if %length(&n) = 0 %then %let n = %str(n); %if %length(&seed) = 0 %then %let seed = %str(0); proc sort data = &frame; by &cluster; data temp1_; set &frame; by &cluster; if first.&cluster then do; npop_ + 1; output; end; call symput('npop_',trim(left(npop_))); keep &cluster; run; data temp_; %if %length(&setup) > 0 %then %do; set &setup; %end; npop_ = &npop_; n_ = &n; keep npop_ n_; data idnos_; set temp1_; retain nprime_ 0 pprime_ 1 rprime_ 0 u_ 0; flag_ = 1; if _n_ = 1 then do; set temp_; nprime_ = npop_; rprime_ = npop_ - n_; u_ = ranuni(&seed); pprime_ = pprime_*rprime_/nprime_; end; if pprime_ > u_ then do; rprime_ = rprime_ - 1; nprime_ = nprime_ - 1; if nprime_ > 0 then pprime_ = pprime_ *rprime_/nprime_; end; else do; output; nprime_ = nprime_ - 1; pprime_ = 1; u_ = ranuni(&seed); if nprime_ > 0 then pprime_ = pprime_*rprime_/nprime_; end; drop nprime_ pprime_ rprime_ u_ npop_ n_; data &sample(drop = flag_); merge &frame idnos_; by &cluster; if flag_ = 1 then output; %if %length(&noprint) = 0 %then %do; proc print data = idnos_ noobs; title 'Clusters Selected'; var &cluster; proc print data = &sample; title1 "Single-Stage Cluster Sample"; title2 "Output Data Set = &sample"; %end; run; title; %mend cl1;